package card;

// static只有一份，要改变就全部改变！

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

// 具体牌以及洗牌、出牌
public class CardDemo {
    // 先给花色创建一个组-类似常数！！
    public static final char[] SUITS = {'♥','♠','♦','♣'};

    // 准备一副牌
    // 注意每一张牌都是由花色以及牌面值组成的，也就是一个Card类型--所以使用List，以Card类型作为参数！

   // List<Card> list = new ArrayList<>();// 注意该处进行修改，写为以下形式

    private static List<Card> preDesk() { // 直接写为一个方法，返回值类型是List<Card>（整副牌）
        List<Card> desk = new ArrayList<>(52);  // 容量52:52张牌
        // 进行牌的初始化
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j <= 13; j++) {
                Card card = new Card(j,SUITS[i]);
                // 每初始化一张牌就把牌存储添加到desk里面（这副牌）
                desk.add(card);
            }
        }
        return desk;
    }

    // 进行洗牌 的实际操作
    private static void washDeskWork(List<Card> deck,int i, int j) {
        // 随机洗牌
        Card fa = deck.get(j);
        deck.set(j, deck.get(i));
        deck.set(i,fa);
    }

    // 创建随机数 +洗牌
    private static void washDesk(List<Card> deck) {
        Random random = new Random(20220728); //种子数
        for (int j = 1; j < deck.size(); j++) { //通过的是下标去打乱顺序，所以注意下标取值！
            // 注意输入的j只能从1开始！！！
            int i = random.nextInt(j);
            // i代表随机下标  j代表该牌的实际位置下标
            // 每获得一次随机位置就进行一次洗牌
            washDeskWork(deck,i,j);
        }
    }

    // 进行抓牌
    private static List<List<Card>> hand(List<Card> deck) {
        // 假设有3个人，每个人5张牌
        // 3个人构成一个数组，而每个人受力的5张牌又是一个数组，
        // 每张牌的返回类型是Card，每一组牌/每个人的返回类型其实是List<Card>
        // 而这三个人和五张牌相当于二维数组--可以用List顺序表表示数组
        List<List<Card>> table = new ArrayList<>();

        table.add(new ArrayList<>());  // 二维数组中的其中一维进行第二维开辟开间
        table.add(new ArrayList<>());
        table.add(new ArrayList<>());

        for (int i = 0; i < 5; i++) { //牌给每人一张
            for (int j = 0; j < 3; j++) { // 人
                /*table.get(j).set(i, deck.remove(i)); //remove的下标是0 永远删除的都是第一个元素！*/

                // 是要将元素添加到table中，而不是设置修改元素，现在一个有效元素都没有！
                table.get(j).add(deck.remove(0)); //注意下标！
            }
        }
        return table;
    }

    public static void main(String[] args) {
        CardDemo cardDemo = new CardDemo();
        // 牌展示
        System.out.println("准备好的完整牌：");
        List<Card> desk = preDesk();
        for (Card x:desk) {
            System.out.print(x.toString() + " ");
        }
        System.out.println();

        System.out.println("洗牌后：");
        washDesk(desk);
        for (Card x:desk) {
            System.out.print(x.toString() + " ");
        }
        System.out.println();

        // 抓牌
        System.out.println("进行抓牌：");
        List<List<Card>> hands = hand(desk);

        // 余牌
        System.out.println("抓牌后的余牌为：");
        for (Card x:desk) {
            System.out.print(x.toString()+" ");
        }
        System.out.println();

        // 每个人的牌
        System.out.println("所抓的每个人的牌进行展示：");
        for (int i = 0; i < 3; i++) {
            System.out.println("第"+(i+1)+"个人的牌展示：");
            /*for (int j = 0; j < 5; j++) {
                System.out.print(hands.get(i).get(j) +" ");
            }
            System.out.println();*/

            System.out.println(hands.get(i)); //注意输出形式！！以一维数组形式进行输出
        }
    }
}
